package code

import (
	"context"
	"fmt"
	"time"
)

// timeout contxt
// context 四个方法
// 1. Deadline(): 返回超时的截止时间
// 2. Done(): u上下文完成时或取消后调用
// 3. Err(): 返回Done()后, 使用Err可以获得结束原因
// 4. Value(): 获取键值
func Context04() {
	// WithTimeout 底层调用 WithDeadline
	// ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
	// ctx, cancel := context.WithTimeoutCause(context.Background(), 1*time.Second, errors.New("timeout"))
	ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(1*time.Second))
	// ctx, cancel := context.WithDeadlineCause(context.Background(), time.Now().Add(1*time.Second), errors.New("timeout"))
	defer cancel()
	go task04(ctx)
	time.Sleep(time.Second * 2)

}

func task04(ctx context.Context) {
	select {
	case <-time.After(3 * time.Second):
		fmt.Println("done")
	case <-ctx.Done():
		fmt.Printf("task: context cancel or timeout:%v, cause:%v\n", ctx.Err(), context.Cause(ctx))
	}

}
